﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "CollaborationCacheInterface.h"

namespace gcmp
{
    class IDocument;

    /// \brief ElementOwner工具类
    class COLLABORATION_CACHE_INTERFACE_EXPORT ElementOwnerUtils final
    {
    public:
        /// \brief 根据ElementId从缓存中获取Element的Owner信息
        ///
        /// ElementId不在缓存中，返回-1
        ///
        /// \param pDocment 文档指针
        /// \param elementId 需要获取Owner信息的ElementId
        /// \return int64_t 对应Element的Owner信息
        static int64_t GetElementOwner(const IDocument* pDocment, const ElementId& elementId);

        /// \brief 根据ElementIds从缓存中批量获取Element的Owner信息
        ///
        /// ElementId不在缓存中，Owner信息为-1
        ///
        /// \param pDocment 文档指针
        /// \param elementIds 需要获取Owner信息的批量ElementIds
        /// \return std::unordered_map<ElementId, int64_t, ElementIdHash> 批量获取的ElementId及对应Owner信息
        static std::unordered_map<ElementId, int64_t, ElementIdHash> GetElementsOwner(const IDocument* pDocment, const std::vector<ElementId>& elementIds);

        /// \brief 获取缓存中该Owner下的所有ElementId
        ///
        /// \param pDocment 文档指针
        /// \param ownerId Owner信息
        /// \return std::vector<ElementId> 该Owner下的所有ElementId
        static std::vector<ElementId> GetElementIdsByOwner(const IDocument* pDocment, int64_t ownerId);

        /// \brief 获取缓存中所有Element的Owner信息
        ///
        /// \param pDocment 文档指针
        /// \return std::unordered_map<ElementId, int64_t, ElementIdHash> 缓存中所有ElementId及对应Owner信息
        static const std::unordered_map<ElementId, int64_t, ElementIdHash> * GetAllElementsOwner(const IDocument* pDocment);

        /// \brief 根据ElementId向缓存中设置Element的Owner
        ///
        /// 不存在添加，存在用新值覆盖
        ///
        /// \param pDocment 文档指针
        /// \param elementId 需要设置版本的ElementId
        /// \param ownerId Owner信息
        /// \return void
        static void SetElementOwner(IDocument* pDocment, const ElementId& elementId, int64_t ownerId);

        /// \brief 根据ElementIds向缓存中批量设置Element的Owner信息
        ///
        /// 不存在添加，存在用新值覆盖
        ///
        /// \param pDocment 文档指针
        /// \param elementsOwner 需要设置版本的ElementIds及对应版本号
        /// \return void
        static void SetElementsOwner(IDocument* pDocment, const std::unordered_map<ElementId, int64_t, ElementIdHash>& elementsOwner);

        /// \brief 根据ElementIds删除缓存中Element的Owner信息
        ///
        /// \param pDocment 文档指针
        /// \param elementId 需要删除Owner信息的ElementId
        /// \return void
        static void DeleteElementOwner(IDocument* pDocment, const ElementId& elementId);

        /// \brief 根据ElementIds批量删除缓存中Element的Owner信息
        ///
        /// \param pDocment 文档指针
        /// \param elementId 需要删除Owner信息的批量ElementId
        /// \return void
        static void DeleteElementsOwner(IDocument* pDocment, const std::vector<ElementId>& elementIds);
    };
}


